Traditional methods and apparatus in multiple requestor systems for accessing shared hardware resources, and in particular main memory, have required that requests to the shared resource maintain a time-ordered or sequences relationship with one another to prevent overwriting or incorrect access to data or instructions by the system. In fact, the possibility of an out-of-order access to a shared resource is normally thought of as an incorrect access to data and/or instructions and is referred to in the prior art as a memory access hazard.
In the prior art, one technique used to control access to shared resources in a multiprocessor system is to maintain a centralized control mechanism that handles requests to the shared resources with a global decision algorithm. When the multiprocessor system has few requestors and few shared resources in a physically small system, this approach is viable. In larger multiprocessor systems with many requestors and many shared resources, the centralized approach using a global decision algorithm becomes unwieldy and the decision time begins to impact the overall processing performance of the multiprocessor system.
Another prior art technique is to interlock the various decisions with time tags so that a given decision will be made only when previous decisions have cleared. The problem with this approach is that the transient time for signals to travel around the system updating these time tags becomes prohibitive and, again, the overall system performance is adversely affected.
In essence, the problem of resource lockout and shared resource access has been managed in prior art supercomputers by employing centralized control mechanisms that schedule each resource sequentially throughout the multiprocessor system. This approach effectively avoids the problem of memory access hazards at the expense of system performance.
In designing new methods and systems for accessing shared resources in a multiprocessor system, there are four important issues to be considered. The first issue is how to maximize the throughput of the shared resources. The second issue is how to maximize the bandwidth between the processors and the shared resources. The third issue is how to minimize the access time between the processors and shared resources. The last issue is how to avoid hazards so that predictable results are obtained for resource requests. When a computer processing system does not have optimized solutions to all of these issues, the performance of the system is effectively limited.
For example, consider the problem of a processor making three requests to main memory, each request destined for a different section of main memory that, as a result, will be processed by three separate logic mechanisms. In the prior art, each of the requests is required to be consecutive and subsequent requests can not begin until the previous request is completed. In the three request example, the requirement for sequential access effectively results in two-thirds of the logic associated with the main memory being idle. This limitation is particularly damaging in high performance systems where the objective is to keep the processing elements and shared resources continually busy by providing them with a steady stream of work to be done in the form of pipelined operations.
In an effort to increase the processing speed and flexibility of such high performance computer processing systems, often referred to as supercomputers, the previously identified parent application to this invention provides an architecture for supercomputers wherein a multiple number of processors and external interfaces can make multiple and simultaneous requests to a common set of shared hardware resources, such as main memory, global registers or interrupt mechanisms. The prior art techniques that utilize centralized control mechanisms to schedule each resource sequentially throughout the multiprocessor system are unacceptable for this type of cluster architecture for highly parallel multiprocessors. Consequently, a new method and apparatus for memory access is needed to increase performance in a multiprocessor system by insuring equal and democratic access for all requestors across all shared resources and allowing each shared resource to process data at independent rates, and at the same time avoiding access hazards.